/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logic;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSet;
import gui.CargaArchivosFrame;
import model.Palabra;
import persistence.SqlConnector;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Map;
import java.sql.CallableStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;

/**
 * Clase encargada
 * @author 
 */
public class HiloGrabador extends Thread {

    private LinkedList<DefaultListener> listaDefaultListener;
    private boolean primeraVez;

    public HiloGrabador() {
        listaDefaultListener = new LinkedList<DefaultListener>();
        primeraVez = false;
    }
    /*
     * Agrega el default listener a la lista de listeners a procesar.
     * Si es la primera vez que se lo llama, se llama al metodo start() del
     * hiloGrabador
     */

    public boolean startServer(DefaultListener defaultListener) {
        CargaArchivosFrame.appendNewText("Documento listo para grabar: " + defaultListener.doc.getPath());
        listaDefaultListener.add(defaultListener);
        if (primeraVez == false) {
            primeraVez = true;
            this.start();
        }
        return true;
    }

    /**
     * Este metodo toma objetos defaultListener de la lista y graba su 
     * vocabulario, sus posteos y su documento en la database.
     */
    @Override
    public void run() {
        while (!this.isInterrupted()) {
            try {
                if (listaDefaultListener.size() != 0) {
                    DefaultListener defListener = listaDefaultListener.getFirst();
                    if (!defListener.getVocabulario().isEmpty()) {

                        SqlConnector sqlConnector = new SqlConnector();
                        CallableStatement cstmt = null;
                        sqlConnector.connect();

                        //Agregamos nuevo Documento y guardamos su ID para posterior uso.
//                        cstmt = sqlConnector.setCallableStatement("{? = call fn_addDocumento(?,?)}");
//                        cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
//                        cstmt.setString(2, defListener.doc.getAbsolutePath());
//                        cstmt.setString(3, defListener.doc.getName());
//                        cstmt.execute();
//                        int idDocumentoGenerado = cstmt.getInt(1);
                        java.sql.Connection coneccion = sqlConnector.getConnection();
                        Statement stmt = coneccion.createStatement();
                        java.sql.ResultSet rs = stmt.executeQuery("select fn_addDocumento('" + defListener.doc.getAbsolutePath() + "','" + defListener.doc.getName() + "')");
                        rs.next();
                        int idDocumentoGenerado = rs.getInt(1);
                        String qq = "update documento set cantPalabras = " + defListener.getNroPalabras() + " where id = " + idDocumentoGenerado;
                        System.out.println(qq);
                        stmt.executeUpdate(qq);
                        //Agregamos cada termino a la BD del vocabulario del documento.
//                        cstmt = sqlConnector.setCallableStatement("{? = call agregar_palabra(?,?,?,?)}");
                        for (Map.Entry<String, Palabra> vocab : defListener.getVocabulario().entrySet()) {
//                            cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
//                            cstmt.setString(2, vocab.getValue().getTermino());
//                            cstmt.setInt(3, vocab.getValue().getTf());
//                            cstmt.setInt(4, idDocumentoGenerado);
//                            cstmt.setInt(5, vocab.getValue().getTermino().hashCode());
//                            cstmt.execute();
                            String cueri = "select agregar_palabra('" + vocab.getValue().getTermino() + "'," + vocab.getValue().getTf() + "," + idDocumentoGenerado + ")";
                            System.out.println(cueri);
                            rs = stmt.executeQuery(cueri);
                            
                            rs.next();
                            int out = rs.getInt(1);
                        }
                    }
                    CargaArchivosFrame.appendNewText("Documento grabado: " + listaDefaultListener.removeFirst().doc.getPath());
                }
            } catch (SQLException ex) {
                javax.swing.JOptionPane.showMessageDialog(null, "SQLException mientras graba vocabulario");
                this.interrupt();
                Logger.getLogger(DefaultListener.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                javax.swing.JOptionPane.showMessageDialog(null, "Exception mientras graba vocabulario");
                this.interrupt();
                Logger.getLogger(DefaultListener.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}